<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //科里化 : curry : 咖喱 
        //科里化: 把多元参数转换成一元参数的过程

        // function fn(a, b) {
        //     return a + b;
        // }

        // function fn(a) {
        //     console.log(a); // 1
        // }
        // fn.bind({
        //     name: "12e"
        // })(1);





        // function add(a, b, c) {
        //     return a + b + c;
        // }

        // add(1, 2, 3);
        // //变为单个传参连续调用的形式
        // /*  add(1)(2)(3); */

        // function curry(add) {
        //     return function (a) {
        //         return function (b) {
        //             return function (c) {
        //                 return a + b + c;
        //             }
        //         }
        //     }
        // }

        // let myadd = curry(add);
        // let res = myadd(1)(2)(3);
        // console.log(res); //6




        //任意参数转换成一元参数

        function add(a, b, c, d) {
            return a + b + c + d;
        }
        //函数的长度就是参数的个数
        console.log(add.length); //4
        //c处理更多参数的curry  不定参数的curry
        function curry(add) {
            return function curryFn(...args) {
                if (add.length > args.length) {
                    //如果参数不够,就继续返回函数,连接传入的参数
                    return function (...args2) {
                        return curryFn(...args, ...args2);
                    }
                } else {
                    //如果参数已经够了,直接执行函数返回函数结果
                    return add(...args);
                }
            }
        }
        let myadd = curry(add);
        console.log(myadd);
        let res = myadd(1)(2)(3)(4);
        console.log(res); //10
    </script>
</body>

</html>